﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Entity;
using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using Business.Data;
//using System.Web.UI.HtmlControls;

/// <summary>
/// Summary description for Utilities
/// </summary>
public class Utilities
{
    public class Times
    {
        public int minTime { get; set; }
        public int maxTime { get; set; }
    }

    // Enkel metod för att få uppercase på första bokstaven i aktuell månad
    public string FirstUpper(string str)
    {
        if (str == null)
            return null;

        if (str.Length > 1)

            return char.ToUpper(str[0]) + str.Substring(1);

        return str.ToUpper();
    }

    // Kollar om PIN-koden stämmer överens med användaren
    // PIN-koden är unik och kan inte finnas på två användare
    public bool CheckPinCodeForBooking(string pinCode, int bookingId)
    {
        bool pinCodeIsCorrect = false;
        user u = null;
        booking b = null;

        using (var cb = new conferenceBookingEntities())
        {
            // Hämtar aktuell bokning
            // Hämtar användaren där pinkoden stämmer överens
            b = cb.bookings.Where(x => x.bookingID == bookingId).FirstOrDefault();
            u = cb.users.Where(x => x.userPass == pinCode).FirstOrDefault();

            // Om både bokningen och användaren hittas, samt stämmer överens
            // med varandra så var pinkoden korrekt
            if (u != null && b != null && b.userID == u.userID)
            {
                pinCodeIsCorrect = true;
            }
            else
            {
                pinCodeIsCorrect = false;
            }
        }

        return pinCodeIsCorrect;
    }

    // Kollar default room
    public string DefaultRoomRedirectExists(string room)
    {
        string returnRedirect = "";

        if (!string.IsNullOrEmpty(room))
        {
            returnRedirect = "&def=" + room;
        }

        return returnRedirect;
    }

    // Splittar en sträng för att få fram timmen och minutrarna.
    // Minutrarna räknas ut (10 * m) / 6 för att få fram rätt värde
    // (10 * 15) / 6 = 25. 15 = 1/4 av 60 och 25 = 1/4 av 100 (double-värde)
    public double CalculateTime(string timeToCalculate)
    {
        double hour;
        double minute;

        string[] timeComponents = timeToCalculate.Split(':');
        hour = Convert.ToDouble(timeComponents[0]);
        minute = Math.Round(((10 * Convert.ToDouble(timeComponents[1])) / 6), 0);

        return Convert.ToDouble(hour + "," + minute);
    }

    // Returnerar alla list-element för att användas i en <ul>.
    // Datan hämtas från databasens rum-tabell
    public string GetRoomHtml(int roomId, DateTime currentDate, string defaultRoom)
    {
        string returnHtml = "";
        string style = "";

        using (var cb = new conferenceBookingEntities())
        {
            foreach (room r in cb.rooms)
            {
                if (Convert.ToInt32(r.roomID) == roomId)
                {
                    style = "active";
                }
                else
                {
                    style = "";
                }
                returnHtml += "<li class=\"" + style + "\"><a href=\"?d=" + currentDate.ToString("yyyy-MM-dd") + "&r=" + r.roomID + defaultRoom + "\">" + r.roomID + "</a></li>";
            }
        }

        return returnHtml;
    }

    // När vi lägger till en användare i databasen
    public string AddUser(string name, string email, string emailVerify)
    {
        string returnRedirect = "";

        // Om e-postadresserna inte matchar
        if (email != emailVerify)
        {
            returnRedirect = "Register.aspx?m=fixFields";
        }

        // Kollar så användaren inte skickat tomma strängar
        else if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(email))
        {
            Utilities utilities = new Utilities();
            if (!utilities.IsValidEmail(email))
            {
                returnRedirect = "Register.aspx?m=fixEmail";
            }
            else
            {
                // Öppnar en koppling och kollar så användaren inte redan finns
                // fast med en annan capitalization. 
                // Sedan läggs användaren till i databasen
                using (var cb = new conferenceBookingEntities())
                {
                    bool userExists = false;
                    foreach (user u in cb.users.Where(x => x.userName.ToUpper() == name.ToUpper()))
                    {
                        userExists = true;
                        break;
                    }
                    if (!userExists)
                    {
                        // Försöker lägga till användaren och ger denna en genererad PIN-kod
                        try
                        {
                            user newUser = new user();
                            newUser.userName = name;
                            newUser.userEmail = email;
                            newUser.userPass = new Random().Next(1000, 9999).ToString();
                            cb.users.Add(newUser);
                            cb.SaveChanges();

                            MailHandler.SendRegistrationMail(newUser.userName, newUser.userEmail, newUser.userPass);
                            returnRedirect = "Register.aspx?m=userAdded&yourPin=" + newUser.userPass;
                        }
                        catch
                        {
                            returnRedirect = "Register.aspx?m=error";
                        }
                    }
                    else
                    {
                        returnRedirect = "Register.aspx?m=userExists";
                    }
                }
            }
        }
        else
        {
            returnRedirect = "Register.aspx?m=nullFields";
        }
        return returnRedirect;
    }

    // Metod för att kolla om angiven sträng ser ut som en
    // e-postadress

    bool invalid = false;

    public bool IsValidEmail(string strIn)
    {
        invalid = false;
        if (String.IsNullOrEmpty(strIn))
            return false;

        // Use IdnMapping class to convert Unicode domain names. 
        try
        {
            strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper,
                    RegexOptions.None, TimeSpan.FromMilliseconds(200));
        }
        catch (RegexMatchTimeoutException)
        {
            return false;
        }

        if (invalid)
            return false;

        // Return true if strIn is in valid e-mail format. 
        try
        {
            return Regex.IsMatch(strIn,
                  @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
                  @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,24}))$",
                  RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
        }
        catch (RegexMatchTimeoutException)
        {
            return false;
        }
    }

    // Används av IsValidEmail
    private string DomainMapper(Match match)
    {
        // IdnMapping class with default property values.
        IdnMapping idn = new IdnMapping();

        string domainName = match.Groups[2].Value;
        try
        {
            domainName = idn.GetAscii(domainName);
        }
        catch (ArgumentException)
        {
            invalid = true;
        }
        return match.Groups[1].Value + domainName;
    }

    public static int CheckStringForRoom(string stringToCheck)
    {
        int roomId;
        if (string.IsNullOrEmpty(stringToCheck))
        {
            roomId = 1;
        }
        else
        {
            roomId = Convert.ToInt32(stringToCheck);
        }
        return roomId;
    }
}